<?php

namespace app\common\lib\astro_fortune_change;

use app\common\cachemodel\zl2\Zl2AstrFortuneContent;
use app\common\lib\astrolog\DailyFortune;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\DbException;
use think\Log;
use think\queue\Job;
use XznsTools\cache\CacheManage;

class AstroFortuneChangeJob
{
    /**
     * 星运变动计算
     * @param Job $job
     * @param $jobData
     * @return void
     * @throws DataNotFoundException
     * @throws ModelNotFoundException
     * @throws DbException
     */
    public function calculateTask(Job $job, $jobData)
    {
        // $jobData = [
        //     'id' => 解锁记录ID
        //     'recode_info' => 档案信息
        // ];
        $jobAttempts = $job->attempts();
        if ($jobAttempts > 2)
        {   // 失败两次 则删除
            $job->delete();
            return;
        }

        $astrFortuneContentModel = new Zl2AstrFortuneContent();
        $info = $astrFortuneContentModel->where('id', $jobData['id'])->find();
        try
        {
            $time = strtotime($info['date']);
            $type = $info['data_type'] == 1 ? 1 : 3;
            $astroFortuneChangeData = DailyFortune::getInstance()
                ->setAdvance(date('Y-m-d 00:00:00', $time))
                ->setMainRecord($jobData['recode_info'])
                ->setChangeType($type)
                ->sensitivity();

            $resData = [];
            foreach ($astroFortuneChangeData as $item)
            {
                if (isset($item['recommend_type']))
                {   // 功能推荐
                    $item['data_type'] = 2; // 数据类型 1=>天象信息  2功能推荐信息
                    $resData[] = $item;
                } else
                {
                    if ($type === 1)
                    {
                        $resData[] = [
                            'data_type' => 1,
                            'tag' => $item['tag'],
                            'title' => $item['title'],
                            'score' => $item['score'],  // 感受度（仅天象有值）
                            'time' => $item['time'],
                            'st' => $item['start_time'] ?? 0,   // 天象开始时间
                            'et' => $item['end_time'] ?? 0, // 天象结束时间
                            'state' => (int)$item['state'],   // 1=>起始 2=>精准 3=>结束（仅逆行、相位）
                            'code' => (int)$item['code'],
                            'status' => (int)$item['status'],  // 1=>好（大笑） 2=>平（微笑） 3=>坏（哭）
                        ];
                    } else
                    {
                        $resData[] = [
                            'tag' => $item['tag'],
                            'title' => $item['title'],
                            'score' => $item['score'],  // 感受度（仅天象有值）
                            'st' => $item['start_time'] ?? 0,   // 天象开始时间
                            'et' => $item['end_time'] ?? 0, // 天象结束时间
                            'time_des' => sprintf("%s-%s", date('m.d', $item['start_time']), date('m.d', $item['end_time'])),
                            'code' => (int)$item['code'],
                            'status' => (int)$item['status'],  // 1=>好（大笑） 2=>平（微笑） 3=>坏（哭）
                        ];
                    }
                }
            }

            $updateData = [
                'content' => json_encode($resData, JSON_UNESCAPED_UNICODE),
                'status' => 1,
                'end_time' => time()
            ];

            $astrFortuneContentModel->where('id', $jobData['id'])->update($updateData);
            $cacheKey = "{$info['uid']}:{$info['rid']}:{$info['date']}:{$info['data_type']}";
            // 删除 星运变动缓存
            CacheManage::getInstance()->setCacheConfig('astro_fortune.astro_fortune_change_content', $cacheKey)->rmCache('details');
        }
        catch (\Exception $e)
        {
            Log::write('星运变动 计算异常 jobData：' . json_encode($jobData, JSON_UNESCAPED_UNICODE) . ' error:' . $e->getMessage() . ' file:' . $e->getFile() . ':' . $e->getLine(), 'error');
            // 计算失败
            $astrFortuneContentModel->where('id', $jobData['id'])->update(['status' => 2, 'end_time' => time()]);
            $cacheKey = "{$info['uid']}:{$info['rid']}:{$info['date']}:{$info['data_type']}";
            // 删除 星运变动缓存
            CacheManage::getInstance()->setCacheConfig('astro_fortune.astro_fortune_change_content', $cacheKey)->rmCache('details');
        }

        $job->delete();
    }
}
